#include "os/c-api/il2cpp-config-platforms.h"

#if !IL2CPP_TINY_WITHOUT_DEBUGGER

#include "os/c-api/Semaphore-c-api.h"
#include "os/Semaphore.h"

extern "C"
{
    UnityPalSemaphore* UnityPalSemaphoreNew(int32_t manualReset, int32_t signaled)
    {
        return new il2cpp::os::Semaphore(manualReset, signaled);
    }

    void UnityPalSemaphoreDelete(UnityPalSemaphore* semaphore)
    {
        IL2CPP_ASSERT(semaphore);
        delete semaphore;
    }

    int32_t UnityPalSemaphorePost(UnityPalSemaphore* semaphore, int32_t releaseCount, int32_t* previousCount)
    {
        IL2CPP_ASSERT(semaphore);
        return semaphore->Post(releaseCount, previousCount);
    }

    UnityPalWaitStatus UnityPalSemaphoreWait(UnityPalSemaphore* semaphore, int32_t interruptible)
    {
        IL2CPP_ASSERT(semaphore);
        return semaphore->Wait((bool)interruptible);
    }

    UnityPalWaitStatus UnityPalSemaphoreWaitMs(UnityPalSemaphore* semaphore, uint32_t ms, int32_t interruptible)
    {
        IL2CPP_ASSERT(semaphore);
        return semaphore->Wait(ms, interruptible);
    }

    UnityPalSemaphoreHandle* UnityPalSemaphoreHandleNew(UnityPalSemaphore* semaphore)
    {
        IL2CPP_ASSERT(semaphore);
        return new UnityPalSemaphoreHandle(semaphore);
    }

    void UnityPalSemaphoreHandleDelete(UnityPalSemaphoreHandle* handle)
    {
        IL2CPP_ASSERT(handle);
        delete handle;
    }

    int32_t UnityPalSemaphoreHandleWait(UnityPalSemaphoreHandle* handle)
    {
        IL2CPP_ASSERT(handle);
        return handle->Wait();
    }

    int32_t UnityPalSemaphoreHandleWaitMs(UnityPalSemaphoreHandle* handle, uint32_t ms)
    {
        IL2CPP_ASSERT(handle);
        return handle->Wait(ms);
    }

    void UnityPalSemaphoreHandleSignal(UnityPalSemaphoreHandle* handle)
    {
        IL2CPP_ASSERT(handle);
        handle->Signal();
    }

    UnityPalSemaphore* UnityPalSemaphoreHandleGet(UnityPalSemaphoreHandle* handle)
    {
        IL2CPP_ASSERT(handle);
        return &handle->Get();
    }
}

#endif
